<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <h1>构造函数继承</h1>
    <p>借用构造函数（constructor stealing）又称伪造对象或经典继承。这种技术的基本思想相当简单，即在子类型构造函数的内部调用超类型构造函数。</p>
    <h2>优点</h2>
    <ul>
        <li>子类可以继承父类内部定义的属性。</li>
        <li>子类的构造方法中，可以给父类的构造方法传参。</li>
    </ul>
    <h2>缺点</h2>
    <ul>
        <li>子类无法使用父类原型对象上的属性。</li>
        <li>子类使用instanceof无法判断是不是父类的实例。</li>
    </ul>
</body>
<script>
    function Parent(name) {
        this.parentName = name;
        this.age = 35;
    }

    Parent.prototype.sayParentName = function () {
        console.log("sayParentName:", this.parentName);
    }

    function Child() {
        Parent.apply(this,arguments);
        this.childName = "childName";
    }

    Child.prototype.sayChildName = function () {
        console.log("sayChildName：", this.childName);
    }

    let parent = new Parent("parentName");
    console.log(parent.parentName); // parentName
    parent.sayParentName(); // 正常调用
    // parent.sayChildName(); // 无法调用（正确）

    console.log("---------------child---------------")
    let child = new Child();
    console.log(child.age); // 35
    // child.sayParentName(); // 无法父类原型上的属性调用（缺点）
    child.sayChildName(); // 正常调用

    console.log(child instanceof Parent); // false

</script>

</html>